* Removed deprecated info- and loaddb requests.
* Added named pipe support. (#104, @pavelxdd)
+
+ * Changed writing buffer length to reduce random io.
+
+ * Added option to fsync the buffer on a configurable interval.
\ No newline at end of file
C_SRCS += \
../src/siri/async.c \
../src/siri/backup.c \
+../src/siri/buffersync.c \
../src/siri/err.c \
../src/siri/heartbeat.c \
../src/siri/optimize.c \
OBJS += \
./src/siri/async.o \
./src/siri/backup.o \
+./src/siri/buffersync.o \
./src/siri/err.o \
./src/siri/heartbeat.o \
./src/siri/optimize.o \
C_DEPS += \
./src/siri/async.d \
./src/siri/backup.d \
+./src/siri/buffersync.d \
./src/siri/err.d \
./src/siri/heartbeat.d \
./src/siri/optimize.d \
C_SRCS += \
../src/siri/async.c \
../src/siri/backup.c \
+../src/siri/buffersync.c \
../src/siri/err.c \
../src/siri/heartbeat.c \
../src/siri/optimize.c \
OBJS += \
./src/siri/async.o \
./src/siri/backup.o \
+./src/siri/buffersync.o \
./src/siri/err.o \
./src/siri/heartbeat.o \
./src/siri/optimize.o \
C_DEPS += \
./src/siri/async.d \
./src/siri/backup.d \
+./src/siri/buffersync.d \
./src/siri/err.d \
./src/siri/heartbeat.d \
./src/siri/optimize.d \
--- /dev/null
+/*
+ * buffersync.h - Buffer sync.
+ *
+ * author : Jeroen van der Heijden
+ * email : jeroen@transceptor.technology
+ * copyright : 2018, Transceptor Technology
+ *
+ */
+#ifndef SIRI_BUFFERSYNC_H_
+#define SIRI_BUFFERSYNC_H_
+
+#include <siri/siri.h>
+
+void siri_buffersync_init(siri_t * siri);
+void siri_buffersync_stop(siri_t * siri);
+
+#endif /* SIRI_HEARTBEAT_H_ */
char default_db_path[XPATH_MAX];
uint8_t pipe_support;
char pipe_client_name[XPATH_MAX];
+ uint32_t buffer_sync_interval;
};
#endif /* SIRI_CFG_H_ */
siri_optimize_t * optimize;
uv_timer_t * backup;
uv_timer_t * heartbeat;
+ uv_timer_t * buffersync;
siri_cfg_t * cfg;
siri_args_t * args;
uv_mutex_t siridb_mutex;
def __init__(self,
n,
- optimize_interval=30,
+ optimize_interval=300,
heartbeat_interval=30,
+ buffer_sync_interval=0,
compression=True,
pipe_name=None,
**unused):
pipe_name
self.listen_client_port = 9000 + n
self.listen_backend_port = 9010 + n
+ self.buffer_sync_interval = buffer_sync_interval
self._server_address = self.SERVER_ADDRESS
self.server_address = \
self._server_address.lstrip('[').rstrip(']').replace(
config.set('siridb', 'ip_support', self.ip_support)
config.set('siridb', 'optimize_interval', self.optimize_interval)
config.set('siridb', 'heartbeat_interval', self.heartbeat_interval)
+ config.set('siridb', 'buffer_sync_interval', self.buffer_sync_interval)
config.set('siridb', 'default_db_path', self.dbpath)
config.set('siridb', 'max_open_files', MAX_OPEN_FILES)
config.set('siridb', 'enable_shard_compression', int(self.compression))
#
heartbeat_interval = 30
+#
+# SiriDB can run fsync on the buffer file on an interval in milliseconds.
+# This value is set to 0 by default which tells SiriDB to run fsync after
+# each insert request. When having many insert requests per second, it can be
+# useful to use an interval like 500 milliseconds.
+#
+#buffer_sync_interval = 500
+buffer_sync_interval = 0
+
#
# SiriDB will not open more shard files than max_open_files. Note that the
# total number of open files can be sligtly higher since SiriDB also needs
--- /dev/null
+/*
+ * buffersync.c - Buffer sync.
+ *
+ * author : Jeroen van der Heijden
+ * email : jeroen@transceptor.technology
+ * copyright : 2018, Transceptor Technology
+ *
+ */
+#include <logger/logger.h>
+#include <siri/db/server.h>
+#include <siri/db/buffer.h>
+#include <siri/buffersync.h>
+#include <uv.h>
+
+
+static uv_timer_t buffersync;
+
+#define BUFFERSYNC_INIT_TIMEOUT 1000
+
+static void BUFFERSYNC_cb(uv_timer_t * handle);
+
+void siri_buffersync_init(siri_t * siri)
+{
+ uint64_t repeat = (uint64_t) siri->cfg->buffer_sync_interval;
+ if (repeat == 0)
+ {
+ siri->buffersync = NULL;
+ return;
+ }
+ siri->buffersync = &buffersync;
+ uv_timer_init(siri->loop, &buffersync);
+ uv_timer_start(
+ &buffersync,
+ BUFFERSYNC_cb,
+ BUFFERSYNC_INIT_TIMEOUT,
+ repeat < 100 ? 100 : repeat);
+}
+
+void siri_buffersync_stop(siri_t * siri)
+{
+ if (siri->buffersync != NULL)
+ {
+ /* stop the timer so it will not run again */
+ uv_timer_stop(&buffersync);
+ uv_close((uv_handle_t *) &buffersync, NULL);
+ siri->buffersync = NULL;
+ }
+}
+
+
+static void BUFFERSYNC_cb(uv_timer_t * handle __attribute__((unused)))
+{
+ siridb_t * siridb;
+ llist_node_t * siridb_node;
+
+ siridb_node = siri.siridb_list->first;
+
+ while (siridb_node != NULL)
+ {
+ siridb = (siridb_t *) siridb_node->data;
+
+ /* flush the buffer, maybe on each insert or another interval? */
+ if (siridb_buffer_fsync(siridb))
+ {
+ log_critical("fsync() has failed on the buffer file");
+ }
+
+ siridb_node = siridb_node->next;
+ }
+}
+
.server_address="localhost",
.default_db_path="/var/lib/siridb/",
.pipe_support=0,
- .pipe_client_name="siridb_client.sock"
+ .pipe_client_name="siridb_client.sock",
+ .buffer_sync_interval=0,
};
static void SIRI_CFG_read_uint(
SIRI_CFG_read_pipe_client_name(cfgparser);
}
+ tmp = siri_cfg.buffer_sync_interval;
+ SIRI_CFG_read_uint(
+ cfgparser,
+ "buffer_sync_interval",
+ 0,
+ 300000,
+ &tmp);
+ siri_cfg.buffer_sync_interval = (uint32_t) tmp;
+
cfgparser_free(cfgparser);
}
#include <logger/logger.h>
#include <qpack/qpack.h>
#include <siri/async.h>
+#include <siri/db/buffer.h>
#include <siri/db/forward.h>
#include <siri/db/insert.h>
#include <siri/db/points.h>
}
}
+ if (siri.buffersync == NULL)
+ {
+ if (siridb_buffer_fsync(siridb))
+ {
+ log_critical("fsync() has failed on the buffer file");
+ }
+ }
+
uv_mutex_unlock(&siridb->series_mutex);
uv_mutex_unlock(&siridb->shards_mutex);
#include <logger/logger.h>
#include <siri/db/server.h>
#include <siri/heartbeat.h>
-#include <siri/db/buffer.h>
#include <uv.h>
-#if DEBUG
-#include <siri/db/series.h>
-#endif
-
static uv_timer_t heartbeat;
#define HEARTBEAT_INIT_TIMEOUT 1000
{
siridb = (siridb_t *) siridb_node->data;
- /* flush the buffer, maybe on each insert or another interval? */
- if (siridb_buffer_fsync(siridb))
- {
- log_critical("fsync() has failed on the buffer file");
- }
-
server_node = siridb->servers->first;
while (server_node != NULL)
{
.fh=NULL,
.optimize=NULL,
.heartbeat=NULL,
+ .buffersync=NULL,
.cfg=NULL,
.args=NULL,
.status=SIRI_STATUS_LOADING,
/* initialize heart-beat task (bind siri.heartbeat) */
siri_heartbeat_init(&siri);
+ /* initialize buffer-sync task (bind siri.buffersync) */
+ siri_buffersync_init(&siri);
+
/* initialize backup (bind siri.backup) */
if (siri_backup_init(&siri))
{
/* stop heart-beat task */
siri_heartbeat_stop(&siri);
+ /* stop buffer-sync task */
+ siri_buffersync_stop(&siri);
+
/* destroy backup (mode) task */
siri_backup_destroy(&siri);